package controller.analisadores;

import controller.analisadores.analisadorlexico.LexicalError;
import controller.analisadores.analisadorlexico.Lexico;
import controller.analisadores.analisadorsemantico.SemanticError;
import controller.analisadores.analisadorsemantico.Semantico;
import controller.analisadores.analisadorsintatico.Sintatico;
import controller.analisadores.analisadorsintatico.SyntaticError;

public class Compilador {

	private Lexico lexico;
	private Sintatico sintatico;
	private Semantico semantico;
	private String entrada;

	public Compilador() {

		lexico = new Lexico();
		semantico = new Semantico();
		sintatico = new Sintatico();

	}

	public void setEntradaLexico(String entrada) {
		this.entrada = entrada;
		lexico.setInput(entrada);
	}

	public void executaSQL() throws LexicalError, SyntaticError, SemanticError {

		sintatico.parse(lexico, semantico);

	}

	public void ResetarCompilador() {
		semantico.resetarSemantico();
		semantico.resetarInsert();
		semantico.resetarListaIdentificadores();
	}

	public String trataErroLexico(LexicalError erro) {

		this.ResetarCompilador();
		return "Erro na linha: " + calculaLinha(lexico.getPosition(), entrada)
				+ " - " + erro.getMessage();
	}

	public String trataErroSintatico(SyntaticError erro) {

		this.ResetarCompilador();
		return "Erro na linha: " + calculaLinha(lexico.getPosition(), entrada)
				+ " - " + "Foi encontrado: " + sintatico.getDescricaoToken()
				+ " " + erro.getMessage();

	}

	public String trataErroSemantico(SemanticError erro) {

		this.ResetarCompilador();
		return "Erro na linha: " + calculaLinha(lexico.getPosition(), entrada)
				+ " - " + erro.getMessage();
	}

	public int calculaLinha(int posicao, String entrada) {

		int linha = 1;

		for (int i = 0; i < posicao; i++) {
			if (entrada.charAt(i) == '\n') {
				linha++;
			}
		}
		return linha;
	}

}
